#include "thread.hpp"
#include "LockGuard.hpp"
#include <vector>
#include <cstdio>
#include <unistd.h>
using namespace threadMould;
static int threadNum = 3;
int tickets = 500;
void route(ThreadDate *td)
{
    while (true)
    {
        LockGuard lockGuard(td->_mutex);//构造自动枷锁，循环一次出作用域自动解锁
        if (tickets > 0) // 非原子操作
        {
            // 抢票
            usleep(1000);
            printf("who:%s,get a ticket: %d \n", td->_name.c_str(),tickets);
            tickets--; // 非原子操作
        }
        else
        {
            break;
        }
    }
}
int main()
{
    // 定义全局锁
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);
    // 管理多线程
    std::vector<Thread> threads;
    // 创建多个线程
    for (int i = 0; i < threadNum; i++)
    {
        std::string name = "thread-" + std::to_string(i + 1);
        ThreadDate *td = new ThreadDate(name, &mutex);//多线程看到的是同一把锁
        threads.emplace_back(name, route, td);
    }
    for(auto& e : threads)
    {
        e.Start();
    }
    // for(auto& e : threads)
    // {
    //     e.Stop();
    // }
    for(auto& e : threads)
    {
        e.Join();
    }
    return 0;
}